function ExcelExporter(){
	this.oXL = null;
	this.oWB = null;
	this.oSheets = null;
}
ExcelExporter.prototype = {
	init : function(){
		try{
			this.oXL = new ActiveXObject ("Excel.Application");
			this.oWB = this.oXL.Workbooks.Add();
			this.oSheets = new Array();
			this.oXL.Visible = false;
		}catch(e){
			alert("\u8bf7\u786e\u8ba4\u60a8\u5df2\u7ecf\u5b89\u88c5MicroSoft Office 2000\u6216\u66f4\u9ad8\u7248\u672c\u7684Excel\u7535\u5b50\u8868\u683c\u8f6f\u4ef6,\u540c\u65f6\u8bf7\u5141\u8bb8\u6d4f\u89c8\u5668\u6267\u884cActiveX\u63a7\u4ef6.");
			this.oXL = null;
			this.oWB = null;
		}
	},
	getDate : function(data){
		if(this.oXL == null || this.oWB == null) return;
		if(typeof(data) == 'undefined' || data == null){
			alert('提示：没有需要导出Excel的数据源!');
			this.destory();
			return;
		}
		if(typeof(data.length) != 'undefined'){
			for(var i = 0; i < data.length; i++){
				var obj = data[i];
				if(typeof(obj) == 'undefined' || obj == null) continue;
				this.toSheetData(obj);
			}
		}else{
			this.toSheetData(data);
		}
	},
	toSheetData : function(data){
		var table = data["table"];
		if(typeof(table) == 'undefined') return;
		table = document.getElementById(table);
		if(typeof(table) == 'undefined' || table == null) return;
		/*------- 整理数据备用 -------*/
		var lcols = 0,lrows = table.rows.length;//行合并不影响整表的统计，整表列数需要统计
		if(lrows <= 0) return;
		var rows = table.rows;
		var cells = rows[0].cells;
		for(var i = 0; i < cells.length; i++){
			var cell = cells[i];
			if(parseInt(cell.colSpan) > 1){
				lcols += parseInt(cell.colSpan);
			} else {
				lcols++;
			}
		}
		var aRowSpans = new Array();//用于保存合并单元格信息
    	for(var i = 0; i < lcols; i++){
        	aRowSpans[i] = 1;
    	}
    	var exclRow = 1;//设置开始行
    	
		/*------- 创建一个sheet、并未sheet命名 -------*/
		var oSheet = null;
		if(this.oSheets.length + 1 > this.oWB.WorkSheets.Count){
			//oSheet = this.oWB.WorkSheets.Add();
			oSheet = this.oWB.WorkSheets.Add(null, this.oWB.WorkSheets(this.oWB.WorkSheets.Count));
		} else {
			oSheet = this.oWB.WorkSheets(this.oSheets.length + 1);
		}
		oSheet.Activate();
		oSheet.Name = data["sheetName"] || oSheet.Name;
		/*---------------- 设置表名称 -----------------*/
		var title = data["title"];
		if(title){
			oSheet.Cells(1, 1) = title;
    		oSheet.Range(oSheet.Cells(exclRow, 1), oSheet.Cells(exclRow, lcols)).Select();//选择该列
    		this.oXL.Selection.HorizontalAlignment = 3;//居中
    		this.oXL.Selection.RowHeight = 30;
    		this.oXL.Selection.Font.Size = 16;
    		this.oXL.Selection.Font.Bold = true;
    		this.oXL.Selection.MergeCells = true;
    		exclRow++;
		}
		/* ------------------ 读取table到Excel、并且处理合并单元格------------------ */
		for(var i = 0; i < lrows; i++){
			var row = rows[i];
			var exclCol = 0;
			var viewCol = -1;//所在表格的位置，如果有行合并时，会与列索引不一致
			var colInx = -1;
    		var colSpans = 1;
    		
			for(var j = 0; j < lcols; j++){
				if(aRowSpans[j] > 1){	
					exclCol++;
					aRowSpans[j]--;
					viewCol++;
					continue;
				}else{
	                colInx++;
	            }
				var cell = row.cells[colInx];
				if(cell == null) continue;
				colSpans = cell.colSpan;
				var rowSpan = cell.rowSpan;
				if(isNaN(rowSpan)) rowSpan = 1;
				for(var k = 0;k < cell.colSpan; k++){
	               viewCol++;
	               exclCol++;
	               aRowSpans[viewCol] = rowSpan;
	            }
	            j += parseInt(cell.colSpan) - 1; //跳过合并列
	            if(cell.rowSpan > 1 || cell.colSpan > 1){
	            	var startCell = oSheet.Cells(exclRow, exclCol);
	            	var endCell = oSheet.Cells(exclRow - 1 + parseInt(cell.rowSpan), exclCol - parseInt(cell.colSpan) + 1);
	                oSheet.Range(startCell, endCell).Select();
	                this.oXL.Selection.MergeCells = true;
	                this.oXL.Selection.NumberFormatLocal = "@";
	                //oSheet.Cells(exclRow,exclCol).HorizontalAlignment = 3;
	                oSheet.Cells(exclRow,exclCol - cell.colSpan + 1).value = cell.innerText;
	            }else{
	            	oSheet.Cells(exclRow,exclCol).NumberFormatLocal = "@";
	                oSheet.Cells(exclRow,exclCol).value = cell.innerText;
	            }
			}
			exclRow++;
		}
		/* ------------------ 设置Excel样式 ------------------ */
		if(data["head"]){
			var temp = null;
			if(data["head"].length > 1){
				temp = data["head"][0] + ":" + data["head"][1];
			} else {
				temp = data["head"][0] ||  data["head"];
			}
			oSheet.Rows(temp).Font.Bold = true;//表头行
			oSheet.Rows(temp).Interior.colorindex = 40;
		}
		if(data["foot"]){
			var temp = null;
			if(data["foot"].length > 1){
				temp = (exclRow - data["foot"][1]) + ":" + (exclRow - data["foot"][0]);
			} else {
				temp = exclRow - (data["foot"][0] || data["foot"]);
			}
			oSheet.Rows(temp).Font.Bold = true;//合计行
			oSheet.Rows(temp).Interior.colorindex = 40;
		}
		var range = oSheet.Range("A1", oSheet.Cells(exclRow - 1, lcols));
		range.HorizontalAlignment = 3;//居中
		range.Borders.LineStyle = 1;
		oSheet.Columns.AutoFit();
		this.oSheets.push(oSheet);
		if(data["template"]){
			this.toSheetTemplate(table, data["templateName"]);
		}
	},
	toSheetTemplate : function(table, name){
		var rows = table.rows;
		var cells = rows[0].cells;
		/*------- 创建一个sheet、并未sheet命名 -------*/
		var oSheet = null;
		if(this.oSheets.length + 1 > this.oWB.WorkSheets.Count){
			oSheet = this.oWB.WorkSheets.Add(null, this.oWB.WorkSheets(this.oWB.WorkSheets.Count));
		} else {
			oSheet = this.oWB.WorkSheets(this.oSheets.length + 1);
		}
		oSheet.Activate();
		oSheet.Name = name || "模板" + "(勿改)" + this.oSheets.length;
		/*---------------- 设置表名称 -----------------*/
		for(var i = 0; i < cells.length; i++){
			cell = cells[i];
			oSheet.Cells(1, i + 1).value = cell.innerText;
			oSheet.Cells(2, i + 1).value = cell.modelKey;
		}
		var range = oSheet.Range("A1", oSheet.Cells(2, i));
		range.NumberFormatLocal = "@";
		range.HorizontalAlignment = 3;//居中
		oSheet.Columns.AutoFit();
		this.oSheets.push(oSheet);
	},
	toExcel : function(){
		this.oWB.WorkSheets(1).Activate();
		this.oXL.Visible = true;
		this.oXL.UserControl = true;
		this.destory();
	},
	destory : function(){
		this.oXL = null;
    	this.oWB = null;
    	for(var i = 0; i < this.oSheets.length; i++){
    		this.oSheets[i] = null;
    	}
	}
}

/*-------------------------------------------------------------------------------------------------*\
|说明：
|	Version： 1.0	
|	Author: Fultone Wang
|	功能描述:
|		1、实现将web页table完整导入Excel，并设置标题、表头、表尾等。
|		2、支持多个table同时导入到Excel的多个中sheet页，并指定sheet页名字。		
|		3、根据页面table中，表头行的单元格含有的modelKey属性，可以指定是否导出模板。
|		4、支持页面table单元格合并，并解决由于单元格合并导致索引与Excel不一致的问题。
|	用法描述：
|		1、在页面导入该Js文件。
|		2、实例化ExcelExporter对象。
|		3、初始化ExcelExporter对象。
|		4、调用ExcelExporter.getDate()方法，传入JSON类型的对象或者JSON对象的数组作为参数。
|			4.1、参数内容:
|				4.1.1、参数类型：JSON对象
|				4.1.2、参数内容：{
|							table:需要导出table的id，此属性必须,
|							title:导出Excel的标题,非必需,
|							head:表头行好。可以是数字，如果出现合并行作为表头，该参数可以是数组，如:[2,3],非必需,
|							foot:同head，表示合计行或者结尾行,非必需,
|							sheetName：导出sheet页的名字，多个sheet页的名字不能重复，服装Excel无法导出,非必需,
|							template:是否导出模板，只有存在该属性，且未true时，才导出模板,非必需,
|							templateName：导出模板的名字,非必需
|						  }
|				4.1.3、应用举例(需导入此JS文件)
|				4.1.3.1、(导出一个sheet)
|					<script language="javascript">
|						var data = {
|							table : "peos_ftable",
|							title : "<s:property value="queryYear"/>年全省服装服饰发放汇总表",
|							head : [2, 3],
|							foot : 1,
|							sheetName : "汇总表数据"
|						};
|						var excelExporter = new ExcelExporter();
|						excelExporter.init();
|						excelExporter.getDate(data);
|						excelExporter.toExcel();
|					</script>
|				4.1.3.2、(导出多个sheet)
|					<script language="javascript">
|						var datas = [];
|						for(var i = 0; i ..){
|							data = {};
|							data.table = tableid;
|							data.title = 'this is title!';
|								.
|								.
|							datas[i] = data;
|						}
|						var excelExporter = new ExcelExporter();
|						excelExporter.init();
|						excelExporter.getDate(datas);
|						excelExporter.toExcel();
|					</script>
|		5、调用ExcelExporter.toExcel()方法，打开Excel，交给用户操作。
|	新版设想：
|		1、完全实现所见即所得。
|		2、导出过程显示进度条。
|		3、解析表格嵌套，按单表格合并单元格解决办法导出Excel。
\*----------------------------------------------------------------------------------------*/